home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / dev / e / 2b_CrtvE_src.lha / io2.s < prev    next >
Text File  |  2001-01-29  |  24KB  |  1,098 lines

  1. ;; Write file
  2. ;; WriteExe
  3. WRITEEXE:
  4.     MOVE.W  #8,CURSPOT
  5.     TST.L   ARGLEN
  6.     BNE.S   .1
  7.     RTS
  8. .1: TSTMOD
  9.     BNE WRITEMODULE
  10.     MOVE.L  A7,.STACK
  11.     MOVE.L  #NAMEBUF,D1
  12.     MOVE.L  LIBINFO(PC),D0
  13.     BEQ.S   .NL
  14.     MOVE.L  D0,A0
  15.     MOVE.L  (A0),D1
  16. .NL:    MOVE.L  #1006,D2
  17.     MOVE.L  DOSBASE(PC),A6
  18.     JSR -30(A6)
  19.     MOVE.L  D0,HANDLE
  20.     BEQ iERROR17
  21.  
  22.  
  23.     MOVE.L  NumHunks,-(A7)
  24.     SUBQ.L  #1,(A7)
  25.     PEA $0.W
  26.     MOVE.L  NumHunks,-(A7)
  27.     PEA $0.W
  28.     PEA $3f3.W
  29.     MOVE.L  A7,D2
  30.     MOVE.L  #20,D3
  31.     BSR WRITEFILE
  32.     LEA 20(A7),A7
  33.     bra .DL
  34. .OF:pea $3e7.W
  35.     pea $0.W
  36.     move.l  a7,d2
  37.     moveq   #8,d3
  38.     bsr     WRITEFILE
  39.     addq.l  #8,a7
  40.  
  41. .DL:MOVE.L  HunkList,D0
  42.     MOVEQ   #0,D3
  43. .SL:MOVE.L  D0,A0
  44.     ADDQ.L  #1,D3
  45.     MOVE.L  H_END(A0),D0
  46.     SUB.L   H_ADDR(A0),D0
  47.     MOVE.L  D0,D2
  48.     and.l   #3,d2
  49.     tst.l   d2
  50.     sne     d2
  51.     and.l   #1,d2
  52.     LSR.L   #2,D0
  53.     add.l   d2,d0
  54.     move.l  H_TYPE(A0),D2
  55.     and.l   #$E0000000,D2
  56.     or.l    d2,d0
  57.     MOVE.L  D0,-(A7)
  58.     MOVE.L  H_NEXT(A0),D0
  59.     BNE     .SL
  60.  
  61.     MOVE.L  A0,A5
  62.  
  63.     LSL.L   #2,D3
  64.     MOVE.L  A7,D2
  65.     BSR     WRITEFILE
  66.  
  67.     MOVE.L  A5,D0
  68. .SW:MOVE.L  D0,A5
  69.     MOVE.L  D0,D2
  70.     ADD.L   #H_TYPE,D2
  71.     MOVEQ   #4,D3
  72.     BSR WRITEFILE
  73.     MOVE.L  H_END(A5),D0
  74.     SUB.L   H_ADDR(A5),D0
  75.     MOVE.W  D0,D2
  76.     AND.L   #3,D2
  77.     TST.L   D2
  78.     Sne     D2
  79.     AND.L   #1,D2
  80.     LSR.L   #2,D0
  81.     ADD.L   D2,D0
  82.     MOVE.L  D0,-(A7)
  83.     MOVE.L  A7,D2
  84.     MOVEQ   #4,D3
  85.     BSR     WRITEFILE
  86.     MOVE.L  (A7)+,D3
  87.     LSL.L   #2,D3
  88.     MOVE.L  H_ADDR(A5),D2
  89.     BSR WRITEFILE
  90.     BSR .DORELOCS
  91.     PEA $3F2.W
  92.     MOVE.L  A7,D2
  93.     MOVEQ   #4,D3
  94.     BSR WRITEFILE
  95.     ADDQ.L  #4,A7
  96.     MOVE.L  H_PREV(A5),D0
  97.     BNE     .SW
  98.     MOVE.L  HANDLE(PC),D1
  99.     MOVE.L  #-4,D2
  100.     MOVE.L  #0,D3
  101.     MOVE.L  DOSBASE(PC),A6
  102.     JSR     -66(A6)
  103.     BRA     .DALEJ
  104.  
  105. .DORELOCS:              ; A5=hunk entry! :)
  106.     TST.L   H_RELO(A5)
  107.     BNe     .SKIP
  108.     RTS
  109. .SKIP:
  110.     BTST    #5,ICODEPREFS+3
  111.     BNE     .OPTIRELOC
  112. .OPTIBACK
  113.     PEA     $3EC.W
  114.     MOVE.L  A7,D2
  115.     MOVEQ   #4,D3
  116.     BSR     WRITEFILE
  117.     ADDQ.L  #4,A7
  118.     MOVE.L  H_RELO(A5),D0
  119.     MOVEQ   #0,D4           ; current dest reloc hunk
  120.     moveq   #0,d5           ; num relocs
  121. .LOOP:
  122.     MOVE.L  D0,A4
  123.     cmp.w   (a4),d4
  124.     bne     .NEXT
  125.     addq.l  #1,d5
  126.     move.l  2(a4),-(a7)
  127. .NEXT:
  128.     MOVE.L  R_NEXT(A4),D0
  129.     BNE     .LOOP
  130.     TST.L   d5
  131.     beq     .NXT2
  132.     move.l  d4,-(a7)
  133.     move.l  d5,-(a7)
  134.     move.l  d5,d3
  135.     addq.l  #2,d3
  136.     lsl.l   #2,d3
  137.     move.l  d3,d5
  138.     move.l  a7,d2
  139.     bsr     WRITEFILE
  140.     add.l   d5,a7
  141. .NXT2:
  142.     moveq   #0,d5
  143.     addq.l  #1,d4
  144.     MOVE.L  H_RELO(A5),D0
  145.     cmp.l   NumHunks,d4
  146.     ble     .LOOP
  147.  
  148.     PEA     $0.W
  149.     MOVE.L  A7,D2
  150.     MOVEQ   #4,D3
  151.     BSR     WRITEFILE
  152.     ADDQ.L  #4,A7
  153.     RTS
  154.  
  155.  
  156.  
  157.  
  158. .OPTIRELOC:
  159.     MOVE.L  A7,D6
  160.     MOVE.L  H_RELO(A5),D0
  161.     MOVEQ   #0,D4           ; current dest reloc hunk
  162.     moveq   #0,d5           ; num relocs
  163.     moveq   #0,d7
  164. .LOOP2:
  165.     MOVE.L  D0,A4
  166.     cmp.w   (a4),d4
  167.     bne     .NEXT2
  168.     MOVE.L  2(A4),D3
  169.     SWAP    D3
  170.     TST.W   D3
  171.     BNE     .NEXT2
  172.     SWAP    D3
  173.     addq.l  #1,d5
  174.     move.w  D3,-(a7)
  175.     moveq   #-1,d7
  176. .NEXT2:
  177.     MOVE.L  R_NEXT(A4),D0
  178.     BNE     .LOOP2
  179.     TST.L   d5
  180.     beq     .NXT3
  181.     move.w  d4,-(a7)
  182.     move.w  d5,-(a7)
  183.     pea $3f7.w
  184.     move.l  a7,d2
  185.     move.l  d6,d3
  186.     sub.l   a7,d3
  187.     bsr     WRITEFILE
  188.     move.l  d6,a7
  189. .NXT3:
  190.     moveq   #0,d5
  191.     addq.l  #1,d4
  192.     MOVE.L  H_RELO(A5),D0
  193.     cmp.l   NumHunks,d4
  194.     ble     .LOOP2
  195.  
  196.     tst.l   d7
  197.     beq     .OPTI2
  198.     PEA     $0.W
  199.     MOVE.L  A7,D2
  200.     MOVEQ   #2,D3
  201.     BSR     WRITEFILE
  202.  
  203.     MOVE.L  HANDLE,D1
  204.     CLR.L   D2
  205.     CLR.L   D3
  206.     JSR     -66(A6) ;seek
  207.     BTST    #1,D0
  208.     BEQ     .EOPTI
  209.     MOVE.L  A7,D2
  210.     MOVEQ   #2,D3
  211.     BSR WRITEFILE
  212. .EOPTI:
  213.     ADDQ.L  #4,A7
  214. .OPTI2:
  215. ; here the code continues, this time for large relocs
  216.  
  217.     MOVE.L  A7,D6
  218.     MOVE.L  H_RELO(A5),D0
  219.     MOVEQ   #0,D4           ; current dest reloc hunk
  220.     moveq   #0,d5           ; num relocs
  221.     moveq   #0,d7
  222. .LOOP3:
  223.     MOVE.L  D0,A4
  224.     cmp.w   (a4),d4
  225.     bne     .NEXT3
  226.     MOVE.L  2(A4),D3
  227.     SWAP    D3
  228.     TST.W   D3
  229.     BEQ     .NEXT3
  230.     SWAP    D3
  231.     addq.l  #1,d5
  232.     move.l  D3,-(a7)
  233.     moveq   #-1,d7
  234. .NEXT3:
  235.     MOVE.L  R_NEXT(A4),D0
  236.     BNE     .LOOP3
  237.     TST.L   d5
  238.     beq     .NXT4
  239.     move.l  d4,-(a7)
  240.     move.l  d5,-(a7)
  241.     pea     $3ec.w
  242.     move.l  a7,d2
  243.     move.l  d6,d3
  244.     sub.l   a7,d3
  245.     bsr     WRITEFILE
  246.     move.l  d6,a7
  247. .NXT4:
  248.     moveq   #0,d5
  249.     addq.l  #1,d4
  250.     MOVE.L  H_RELO(A5),D0
  251.     cmp.l   NumHunks,d4
  252.     ble     .LOOP3
  253.  
  254.     tst.l   d7
  255.     beq     .EXIT
  256.     PEA     $0.W
  257.     MOVE.L  A7,D2
  258.     MOVEQ   #4,D3
  259.     BSR     WRITEFILE
  260.     ADDQ.L  #4,A7
  261. .EXIT:
  262.     RTS
  263.  
  264. .STACK:
  265.     DC.L    0
  266.  
  267.  
  268. .DALEJ:
  269.     move.l  SYMADDR(PC),D2
  270.     beq     .dalej2
  271.     move.l  SYMEND(PC),D3
  272.     SUB.l   d2,d3
  273.     bsr WRITEFILE
  274. .dalej2:
  275.     MOVE.L  LINEBUF(PC),D2
  276.     BEQ.S   .2
  277.     MOVE.L  LINEBUFCUR(PC),D3
  278.     CMP.L   LINEBUFCURSTART(PC),D3  ; ONLY IF LINEDEBUGSIZE<>0
  279.     BEQ.S   .2
  280.     SUB.L   D2,D3
  281.     MOVE.L  D3,D4
  282.     SUBQ.L  #8,D4
  283.     LSR.L   #2,D4
  284.     MOVE.L  D2,A0
  285.     MOVE.L  D4,4(A0)
  286.     BSR WRITEFILE
  287.  
  288.     BSR WRITEEVARONLY
  289.     LEA DEBUGLIST(PC),A5
  290. .XL:MOVE.L  (A5),D0
  291.     BEQ.S   .2
  292.     MOVE.L  D0,A5
  293.     MOVE.L  4(A5),D2
  294.     MOVE.L  D2,A0
  295.     MOVE.L  4(A0),D3
  296.     MOVE.L  8(A5),D0
  297.     OR.L    #$4C000000,D0
  298.     MOVE.L  D0,12(A0)
  299.     LSL.L   #2,D3
  300.     ADDQ.L  #8,D3
  301.     CMP.L   #$3F1,0(A0,D3.L)
  302.     BNE.S   .NEVAR
  303.     MOVE.L  4(A0,D3.L),D0       ; ADD EVAR HUNK
  304.     ADDQ.L  #2,D0
  305.     LSL.L   #2,D0
  306.     ADD.L   D0,D3
  307. .NEVAR: BSR WRITEFILE
  308.     BRA.S   .XL
  309. .2:
  310.     MOVE.L  #ENDHUNK,D2
  311.     MOVEQ   #4,D3
  312.     BSR WRITEFILE
  313.     MOVE.L  DOSBASE(PC),A6
  314.     MOVE.L  HANDLE(PC),D1
  315.     JSR -36(A6)
  316.     MOVE.L  .STACK(PC),A7
  317.     RTS
  318. SYMADDR:
  319.     DC.L    0
  320. SYMEND:
  321.     DC.L    0
  322. ;*-*
  323. ;; WriteModule
  324. WRITEMODULE:
  325.     MOVE.L  #NAMEBUF,A2     ; FIX '.M'
  326.     ADD.L   ARGLEN(PC),A2       ; A2=MIDARG
  327.     MOVE.B  #'.',(A2)
  328.     MOVE.B  #'m',1(A2)
  329.     MOVE.B  #0,2(A2)
  330.  
  331.     MOVE.L  #NAMEBUF,D1     ; OPEN MODULE FOR WRITING
  332.     MOVE.L  #1006,D2
  333.     MOVE.L  DOSBASE(PC),A6
  334.     JSR -30(A6)
  335.     MOVE.L  D0,HANDLE
  336.     BEQ iERROR17
  337.  
  338.     MOVE.L  #.1,D2          ; WRITE "EMOD" HEADER
  339.     MOVEQ   #4,D3
  340.     BSR WRITEFILE
  341.  
  342.     BSR WRITESYSINFOS
  343.     BSR WRITECODEINFOS
  344.     BSR WRITERELOCINFOS
  345.     BSR WRITEPROCINFOS
  346.     BSR WRITEGLOBINFOS
  347.     BSR WRITEOBJECTINFOS
  348.     BSR WRITECONSTINFOS
  349.     BSR WRITEMODINFOS
  350.     BSR WRITEDEBUGINFOS
  351.     JSR PREPSAVEMACROS
  352.  
  353.     MOVE.L  #.2,D2          ; WRITE END
  354.     MOVEQ   #2,D3
  355.     BSR WRITEFILE
  356.  
  357.     MOVE.L  DOSBASE(PC),A6
  358.     MOVE.L  HANDLE(PC),D1
  359.     JSR -36(A6)
  360.  
  361.     MOVE.L  #NAMEBUF,D0     ; FLUSH THE MODULE
  362.     MOVE.L  D0,A0
  363.     LOWER   A0,D1
  364.  
  365.     BSR FLUSHMODULE
  366.  
  367.     RTS
  368. .1: DC.L    "EMOD"          ; HEADER
  369. .2: DC.W    0           ; END
  370.  
  371.  
  372. WRITEFILE:            ; D2=ADR,D3=LEN
  373.     MOVE.L  HANDLE(PC),D1
  374.     MOVE.L  DOSBASE(PC),A6
  375.     JSR -48(A6)
  376.     RTS
  377.  
  378. CODEAMOUNT:   DC.L    0
  379.  
  380. HUNK:
  381.     DC.L    1011            ; hunkheader
  382.     DC.L    0,1,0,0         ; endofnames,1hunk,firsthunkno,lasthn
  383. CODESIZE:
  384.     DC.L    0           ; CODESIZE/4 hunklentab
  385.     DC.L    1001            ; hunkcode
  386. CODESIZE2:
  387.     DC.L    0           ; CODESIZE/4
  388. ENDHUNK:
  389.     DC.L    1010            ; last
  390. LHUNK:
  391.     DC.L    $3e7
  392.     DC.L    0,$3e9
  393. CODESIZE3:
  394.     DC.L    0
  395.  
  396. ;; Evars
  397. WRITEEVARONLY:
  398.     MOVE.L  #ESTACKBUF,A4       ; A4=BUF,D4=BEGIN
  399.     MOVE.L  A4,D4
  400.     MOVE.L  #$3F1,(A4)+     ; HUNK_DEBUG
  401.     CLR.L   (A4)+           ; HUNKLEN
  402.     CLR.L   (A4)+
  403.     MOVE.L  #"EVAR",(A4)+       ; "EVAR"
  404.     LEA DBLIST(PC),A5       ; A5=LIST
  405.     TST.L   (A5)
  406.     BEQ.W   .OUT
  407. .XL:MOVE.L  (A5),D0
  408.     BEQ.S   .X
  409.     MOVE.L  D0,A5
  410.     MOVEQ   #0,D3           ; D3=WLEN
  411.     CMP.W   #4,4(A5)
  412.     BNE.S   .1
  413.     MOVE.W  6(A5),D3
  414.     LSR.W   #1,D3
  415.     ADDQ.L  #1,D3
  416.     BRA.S   .2
  417. .1: MOVE.W  8(A5),D3
  418.     ADDQ.L  #2,D3
  419. .2: LEA 4(A5),A0
  420. .CL:    MOVE.W  (A0)+,(A4)+
  421.     DBRA    D3,.CL
  422.     CHESTB  A4,D0,3,iERROR37
  423.  
  424.     CMP.W   #4,4(A5)
  425.     BNE.S   .NSELF
  426.     CMP.W   #5,(A0)
  427.     BNE.S   .NSELF
  428.     MOVE.L  (A0)+,(A4)+
  429.     MOVE.L  (A0)+,(A4)+
  430. .NSELF:
  431.     BRA.S   .XL
  432. .X: MOVE.L  A4,D3
  433.     SUB.L   D4,D3
  434.     BTST    #1,D3
  435.     BEQ.S   .LE
  436.     CLR.W   (A4)+
  437.     ADDQ.L  #2,D3
  438. .LE:    MOVE.L  D4,A0
  439.     MOVE.L  D3,D0
  440.     SUBQ.L  #8,D0
  441.     LSR.L   #2,D0
  442.     MOVE.L  D0,4(A0)
  443.     MOVE.L  D4,D2
  444.     BSR WRITEFILE
  445. .OUT:   RTS
  446. ;*-*
  447. ;; Debug infos
  448. WRITEDEBUGINFOS:
  449.     TST.L   LINEBUF
  450.     BEQ.S   .2
  451.     MOVE.L  LINEBUFCUR(PC),D3   ; TEST EMPTYNESS
  452.     CMP.L   LINEBUFCURSTART(PC),D3
  453.     BEQ.S   .2
  454.     MOVE.L  #.4,D2          ; WRITE DEBUGHEAD
  455.     MOVE.L  #2,D3
  456.     BSR WRITEFILE
  457.     MOVE.L  LINEBUF(PC),D2
  458.     MOVE.L  LINEBUFCUR(PC),D3   ; WRITE LINE-DEBUG HUNK
  459.     SUB.L   D2,D3
  460.     MOVE.L  D3,D4
  461.     SUBQ.L  #8,D4
  462.     LSR.L   #2,D4
  463.     MOVE.L  D2,A0
  464.     MOVE.L  D4,4(A0)        ; LEN
  465.     BSR WRITEFILE
  466.     BSR WRITEEVARONLY
  467.     MOVE.L  #.3,D2          ; WRITE LEN NO FURTHER INFOS
  468.     MOVE.L  #4,D3
  469.     BSR WRITEFILE
  470. .2: RTS
  471. .3: DC.L    0
  472. .4: DC.W    10
  473. ;*-*
  474. ;; Code infos
  475. WRITECODEINFOS:
  476.     MOVE.L  CODEAMOUNT(PC),D4
  477.     BEQ.S   .X
  478.     LSR.L   #2,D4
  479.     MOVE.L  D4,.1+2
  480.     MOVE.L  #.1,D2
  481.     MOVEQ   #6,D3
  482.     BSR WRITEFILE
  483.     MOVE.L  ACODE(PC),D2        ; WRITE CODE
  484.     MOVE.L  CODEAMOUNT(PC),D3
  485.     BSR WRITEFILE
  486. .X: RTS
  487. .1: DC.W    3
  488.     DC.L    0
  489. ;*-*
  490. ;; Reloc infos
  491. RELOCTABSTART:    DC.L    0
  492.  
  493. WRITERELOCINFOS:
  494.     MOVE.L  NUMRELOC(PC),D4
  495.     BEQ.S   .X
  496.     MOVEQ   #2,D3
  497.     MOVE.L  #.1,D2
  498.     BSR WRITEFILE
  499.     LSL.L   #2,D4
  500.     ADDQ.L  #4,D4           ; WRITE NUM ALSO
  501.     MOVE.L  RELOCTABSTART(PC),A0
  502.     MOVE.L  -4(A0),(A0)
  503.     MOVE.L  A0,D2
  504.     MOVE.L  D4,D3
  505.     BSR WRITEFILE
  506. .X: RTS
  507. .1: DC.W    7
  508. ;*-*
  509. ;; Object infos
  510. WRITEOBJECTINFOS:     ; for objects & members -SAME-
  511.     MOVE.L  #ESTACKBUF,D5   ; EStackBuffer
  512.     MOVE.L  D5,A5           ; D5,A5=BUF
  513.     LEA OLIST+4,A3          ; A3=ObjectLIST
  514.     MOVEQ   #0,D7           ; D7=OBJECT COUNT
  515. .XL:MOVE.L  ONEXT(A3),A3    ; Next object
  516.     MOVE.L  A3,D0           ; End of list?
  517.     BEQ.W   .E              ; .E(nd)
  518.     TST.L   OACC(A3)        ; Access -> TEMP: HAVE TO EXPORT
  519.     BNE.S   .1              ; we have to.
  520.     BTST    #0,OFLAGS(A3)   ; #0 -> OPT EXPORT?
  521.     BEQ.S   .XL             ; No; skip the object, get another one.
  522. .1: BTST    #1,OFLAGS(A3)   ;
  523.     BNE.S   .XL             ;
  524.     ADDQ.L  #1,D7           ; Ok, let's parse this object.
  525.     MOVE.W  #2,(A5)+        ; #2 = OBJECT JOB
  526.     CLR.L   (A5)+           ; SKIPSIZE
  527.     MOVE.W  OSIZE(A3),D1    ; D1=OHEADSIZE
  528.     MOVE.W  #-1,OSIZE(A3)   ;
  529.     MOVE.L  A3,A0           ;
  530.     BSR .DOREC              ;
  531.     LEA OMEMB+4(A3),A4      ; list of members in A4
  532. .ML:MOVE.L  ONEXT(A4),A4    ; next member; ONEXT=-4!!!! Look at previous command
  533.     MOVE.L  A4,D0           ; Reached last one?
  534.     BEQ.W   .EOO            ; Yes.
  535.     MOVE.L  A4,A0           ;
  536.     BTST    #0,OFLAGS(A0)   ; EXPORT?
  537.     BNE.S   .ML             ; No.
  538.     BSR .DOREC              ; Yes -> copy member name
  539.     BTST    #1,OFLAGS(A0)   ; Object typed?
  540.     BEQ.S   .NT             ; No.
  541.     MOVE.L  OPTRTYPE(A0),D0 ; pointer to objectname
  542.     MOVE.L  D0,D4           ;
  543.     AND.L   #$FFFFFFF0,D4   ; ptr to object or LONG/INT/CHAR?
  544.     BEQ.S   .NO             ; no objects->jump
  545.     MOVE.L  D0,A2           ;
  546.     MOVEQ   #-1,D0          ;
  547. .NO:
  548.     MOVE.W  D0,(A5)+        ;
  549.     TST.L   D0              ; temporarily set name to -1
  550.     BPL.S   .NTS            ;
  551.     CLR.W   (A5)+           ;
  552.     MOVE.L  A5,D4           ;
  553.     MOVE.L  OASCII(A2),A2   ; object name (ptr to objectname)
  554. .CL:MOVE.B  (A2)+,(A5)+
  555.     BNE.S   .CL
  556.     MOVE.L  A5,D0           ;
  557.     BTST    #0,D0           ; even length
  558.     BEQ.S   .EE             ;
  559.     CLR.B   (A5)+           ;
  560. .EE:MOVE.L  A5,D0
  561.     SUB.L   D4,D0           ;
  562.     MOVE.L  D4,A2           ;
  563.     MOVE.W  D0,-(A2)        ; Set ptrname length
  564.     BRA.S   .NTS            ;
  565. .NT:CLR.W   (A5)+           ; object not typed and no name copied
  566. .NTS:
  567.     CHESTB  A5,D0,5,iERROR37 ;
  568.     BRA.W   .ML             ;
  569. .E: MOVE.L  D5,D2           ;
  570.     MOVE.L  A5,D3           ;
  571.     SUB.L   D2,D3           ;
  572.     MOVE.L  D5,A5           ;
  573.     MOVE.L  D3,D5           ;
  574.     SUBQ.L  #6,D5           ;
  575.     MOVE.L  D5,2(A5)        ; ptr to <another>
  576.     TST.L   D7              ;
  577.     BEQ.S   .LEAVE          ;
  578.     BSR WRITEFILE           ;
  579. .LEAVE: RTS                 ;
  580.  
  581.  
  582. .DOREC: MOVE.W  #-1,(A5)+       ; len=-1 (no id)
  583.     MOVE.W  OSIZE(A0),(A5)+     ; copy object size
  584.     MOVE.W  OOFF(A0),(A5)+      ; copy delegates offset
  585.     MOVE.L  A5,A1               ;
  586.     MOVE.L  OASCII(A0),A2       ; object ascii name
  587.     MOVE.L  A2,D0               ; or <NIL>
  588.     BEQ.S   .PRIV               ; if private
  589. .DL:
  590.     MOVE.B  (A2)+,(A5)+         ; copy object name
  591.     BNE.S   .DL                 ;
  592.     MOVE.L  A5,D0               ;
  593.     BTST    #0,D0               ; must be word aligned
  594.     BEQ.S   .EQ                 ;
  595.     CLR.B   (A5)+               ;
  596. .EQ:MOVE.L  A5,D0               ; id len
  597.     SUB.L   A1,D0               ;
  598.     MOVE.W  D0,-6(A1)           ; it's the thing we've set to "-1" at start of this part
  599. .PRIV:  RTS                     ;
  600.  
  601.  
  602. ; FOLLOWING CODE IS USED ONLY WHEN OBJECT HAS A METHODS!
  603.  
  604.  
  605. .EOO:   CLR.W   (A5)+           ; "END OF OBJECTS"
  606.     MOVE.W  D1,(A5)+            ; ???
  607.  
  608.     ; LEAVE A3,A5, D5,D7
  609.  
  610.     MOVE.W  ODEL(A3),(A5)+      ; DELSIZE:INT
  611.     BEQ.W   .ECL
  612.     MOVE.L  ODCODE(A3),D0
  613.     SUB.L   ACODE,D0
  614.     MOVE.L  D0,(A5)+            ; DELCODE:OFF
  615.     CLR.W   (A5)+               ; SUPERASCLEN:INT
  616.     MOVE.W  ODELOFF(A3),(A5)+   ; ODELOFF:INT
  617.     MOVE.W  ODESTR(A3),(A5)+    ; ODESTR:INT
  618.     LEA OMETHOD(A3),A0
  619. .MEL:   MOVE.L  (A0),D0
  620.     BEQ.S   .MEX
  621.     MOVE.L  D0,A0               ; (A0=METHOD)
  622.     MOVE.L  M_TYPE(A0),(A5)+    ; TYP:CHAR,FL:CHAR,OFF:INT
  623.     ADDQ.L  #2,A5               ; ASCLEN:INT
  624.     MOVE.L  A5,A1               ; (A1=PATCHBACK)
  625.     MOVE.L  M_NAME(A0),A2
  626. .MLL:   MOVE.B  (A2)+,(A5)+     ; ASCBYTES
  627.     BNE.S   .MLL
  628.     MOVE.L  A5,D0
  629.     ADDQ.L  #1,D0
  630.     BCLR    #0,D0
  631.     MOVE.L  D0,A5
  632.     SUB.L   A1,D0
  633.     MOVE.W  D0,-2(A1)
  634.     MOVE.L  M_PROC(A0),A1       ; (A1=PROC)
  635.     MOVE.W  (A1),(A5)+          ; NARGS:INT
  636.  
  637.  
  638.     MOVE.L  6(A1),D0            ; LISTLEN:INT, LIST:LONGS
  639.     BEQ.S   .DZERO
  640.     MOVE.L  D0,A2
  641.     MOVE.W  (A2)+,D0
  642.     MOVE.W  D0,(A5)+
  643.     BEQ.S   .DDONE
  644.     SUBQ.W  #1,D0
  645. .DEFAL: MOVE.L  (A2)+,(A5)+
  646.     DBRA    D0,.DEFAL
  647.     BRA.S   .DDONE
  648. .DZERO: CLR.W   (A5)+
  649. .DDONE:
  650.     BRA.S   .MEL
  651. .MEX:   MOVE.W  #-1,(A5)+       ; END -> TYP+FL = -1
  652.  
  653.     LEA OACC(A3),A0
  654. .AL:MOVE.L  (A0),D0         ; LISTOF CODE:OFF, TYP:INT
  655.     BEQ.S   .AX
  656.     MOVE.L  D0,A0
  657.     MOVE.W  8(A0),(A5)+
  658.     MOVE.L  4(A0),D0
  659.     SUB.L   ACODE(PC),D0
  660.     MOVE.L  D0,(A5)+
  661.     BRA.S   .AL
  662. .AX:    MOVE.W  #-1,(A5)+       ; END -> -1:INT
  663.  
  664. .ECL:
  665.     BRA .XL
  666. ;*-*
  667. ;; Sys infos
  668. WRITESYSINFOS:
  669.     MOVE.L  #ESTACKBUF,D2
  670.     MOVE.L  D2,A5           ; D5,A5=BUF
  671.     MOVE.W  #5,(A5)+
  672.     MOVE.L  MINSTACK(PC),(A5)+
  673.     MOVE.W  OSVERSION(PC),(A5)+
  674.     MOVE.L  CODEPREFS(PC),(A5)+
  675.     MOVE.L  ECPU(PC),(A5)+      ; CPU+FPU
  676.     MOVE.W  ASMCPU(PC),(A5)+
  677.     MOVE.W  #CURVERSION,(A5)+
  678.     CLR.L   (A5)+
  679.     MOVE.L  ICODEPREFS(PC),(A5)+
  680.     MOVEQ   #28,D3          ; HEAD+22
  681.     BSR WRITEFILE
  682.     RTS
  683. ;*-*
  684. ;; Const infos
  685. WRITECONSTINFOS:
  686.     MOVE.L  #ESTACKBUF,D5
  687.     MOVE.L  D5,A5           ; D5,A5=BUF
  688.     MOVE.W  #1,(A5)+
  689.     CLR.L   (A5)+           ; SKIPSIZE
  690.     MOVE.L  #CONSTHASH,A3
  691.     MOVEQ   #0,D7           ; #OF CONST WRITTEN
  692.     
  693.     MOVE.L  ConstsList,D3
  694. .a: TST.L   D3
  695.     BEQ     .X
  696.  
  697.     MOVE.L  D3,A3
  698.     MOVe.L  (A3),D3
  699.     MOVE.L  4(A3),A3
  700.     BTST    #0,CFLAGS(A3)
  701.     BEQ     .a
  702.     BTST    #1,CFLAGS(A3)
  703.     bne     .STR
  704.     ADDQ.L  #1,D7
  705.     MOVe.L  A5,A4
  706.     ADDQ.L  #2,A5
  707.     MOVE.L  CVAL(A3),(A5)+
  708.     MOVe.L  CASCII(A3),A2
  709. .d: MOVE.B  (A2)+,(A5)+
  710.     BNE.S   .d
  711.     MOVE.L  A5,D4
  712.     BTST    #0,D4
  713.     BEQ     .c
  714.     CLR.B   (A5)+
  715. .c: MOVe.L  A5,D0
  716.     SUB.L   A4,D0
  717.     SUBQ.L  #6,D0
  718.     MOVE.W  D0,(A4)
  719. .lx:
  720.     CHESTB  A5,D0,5,iERROR37
  721.     BRA     .a
  722.  
  723. .STR:
  724.     move.b  #-1,(a5)+
  725.     clr.b   (a5)+
  726.     ADDQ.L  #1,D7
  727.     MOVe.L  A5,A4
  728.     ADDQ.L  #2,A5
  729.     moveq   #0,d4
  730.     move.l  CASCII(a3),a2
  731. .CP1:
  732.     addq.l  #1,d4
  733.     move.b  (a2)+,(a5)+
  734.     bne     .CP1
  735.     btst    #0,d4
  736.     beq     .NF1
  737.     clr.b   (a5)+
  738.     addq.l  #1,d4
  739. .NF1:
  740.     move.w  d4,(a4)
  741.     move.l  CVAL(a3),a2
  742.     move.w  (a2)+,d4
  743.     move.w  d4,(a5)+
  744. .CP2:
  745.     move.b  (a2)+,(a5)+
  746.     dbf     d4,.CP2
  747.     move.l  a5,d4
  748.     btst    #0,d4
  749.     beq     .NF2
  750.     clr.b   (a5)+
  751. .NF2:
  752.     bra     .lx
  753.  
  754.  
  755. .X: CLR.W   (A5)+
  756.     MOVE.L  D5,D2
  757.     MOVE.L  A5,D3
  758.     SUB.L   D2,D3
  759.     MOVE.L  D5,A5
  760.     MOVE.L  D3,D5
  761.     SUBQ.L  #6,D5
  762.     MOVE.L  D5,2(A5)
  763.     TST.L   D7
  764.     BEQ.S   .LEAVE
  765.     BSR WRITEFILE
  766. .LEAVE: RTS
  767. ;*-*
  768. ;; Proc infos
  769. WRITEPROCINFOS:
  770.     MOVEQ   #0,D1           ; D1=PROC COUNT
  771.     MOVE.L  #ESTACKBUF,D5
  772.     MOVE.L  D5,A5           ; D5,A5=BUF
  773.     MOVE.W  #4,(A5)+
  774.     MOVE.L  LABM+8,A0       ; A0=LABELBUF
  775.     MOVE.L  ACODE,D3        ; D3=ACODE
  776.     MOVE.L  #IDENTHASH+4,D6
  777.     MOVE.L  #IDENTHASH+1028,D7  ; D6,D7=IDENTBUF,END
  778. .OLOOP: MOVE.L  D6,A4
  779.     ADDQ.L  #4,D6
  780.     CMP.L   D6,D7
  781.     BEQ .EX
  782. .LOOP:  MOVE.L  -(A4),A4
  783.     MOVE.L  A4,D4
  784.     BEQ.S   .OLOOP
  785.     CMP.B   #LAB,4(A4)
  786.     BNE.S   .LOOP
  787.     BTST    #2,5(A4)        ; MUST BE EXPORT
  788.     BEQ.S   .LOOP
  789.     BTST    #4,5(A4)        ; MUSN'T BE METHOD
  790.     BNE.S   .LOOP
  791.     ADDQ.L  #1,D1
  792.     MOVE.L  (A4),A3         ; ident record
  793.     MOVE.L  A5,A2
  794.     ADDQ.L  #2,A5
  795. .COPY:  MOVE.B  (A3)+,(A5)+ ; COPY IDENTIFIER
  796.     BNE.S   .COPY
  797.     MOVE.L  A5,D0
  798.     SUB.L   A2,D0
  799.     SUBQ.L  #2,D0
  800.     BTST    #0,D0
  801.     BEQ.S   .1
  802.     CLR.B   (A5)+
  803.     ADDQ.L  #1,D0
  804. .1: MOVE.W  D0,(A2)         ; set lenght
  805.  
  806.     CHESTB  A5,D0,5,iERROR37
  807.  
  808.     MOVEQ   #0,D0
  809.     MOVE.W  10(A4),D0       ; LABEL-ID
  810.     LSL.L   #2,D0
  811.     MOVE.L  0(A0,D0.L),D0
  812.     SUB.L   D3,D0
  813.     MOVE.L  D0,(A5)+
  814.  
  815.     MOVE.L  6(A4),D0
  816.     BEQ     .LAB
  817.     MOVE.W  #1,(A5)+        ; THIS IS A PROC
  818.     MOVE.L  D0,A3
  819.     MOVE.W  (A3),(A5)+      ; NRARG
  820.     MOVE.W  4(A3),(A5)+     ; NRLOC (NEG)*4
  821.  
  822.     BTST    #5,2(A3)
  823.     BEQ     .NOREGS
  824.     MOVE.W  #-1,(A5)+
  825.     moveq   #0,d0
  826.     MOVE.W  (A3),D0
  827.     MOVE.W  D0,(A5)+
  828.     MOVE.L   6(a3),a2
  829.     addq.l  #2,a2
  830.     subq.l  #1,d0
  831. .LOCAL1:
  832.     MOVE.W  (a2)+,(a5)+
  833.     dbf d0,.LOCAL1
  834.     move.l  #0,(a5)+
  835.     BRA .LOOP
  836. .NOREGS:
  837.  
  838.     BTST    #6,2(A3)
  839.     BNE     .SETUPCLEANUP
  840.     BTST    #7,2(A3)
  841.     BEQ     .OTHER_STUFF
  842. .SETUPCLEANUP:
  843.     MOVE.W  #-2,(A5)+
  844.     MOVE.B  2(A3),D0
  845.     and.l   #192,d0
  846.     MOVE.W  D0,(A5)+
  847.     CLR.L   (A5)+
  848.     BRA .LOOP
  849.  
  850.  
  851. .OTHER_STUFF:
  852.     MOVE.L  6(A3),D0
  853.     BEQ.S   .DZERO
  854.     MOVE.L  D0,A3
  855.     MOVE.W  (A3)+,D0
  856.     MOVE.W  D0,(A5)+
  857.     BEQ.S   .NDEFA
  858.     SUBQ.W  #1,D0
  859. .DEFAL: MOVE.L  (A3)+,(A5)+
  860.     DBRA    D0,.DEFAL
  861. .NDEFA: MOVE.W  (A3)+,D0
  862.     MOVE.W  D0,(A5)+
  863.     BEQ.W   .LOOP
  864.     SUBQ.W  #1,D0
  865.     MOVE.L  A5,A1
  866. .NL:    MOVE.L  (A3)+,A2
  867. .NL2:   MOVE.B  (A2)+,(A5)+
  868.     BNE.S   .NL2
  869.     MOVE.B  #",",-1(A5)
  870.     DBRA    D0,.NL
  871.     CLR.B   -1(A5)
  872.     MOVE.L  A5,D0
  873.     BTST    #0,D0
  874.     BEQ.S   .11
  875.     CLR.B   (A5)+
  876. .11:    MOVE.L  A5,D0
  877.     SUB.L   A1,D0
  878.     MOVE.W  D0,-2(A1)
  879.     BRA .LOOP
  880. .LAB:   MOVE.W  #2,(A5)+        ; THIS ONE IS A LABEL
  881.     BRA .LOOP
  882. .DZERO: CLR.L   (A5)+
  883.     BRA .LOOP
  884. .EX:    MOVE.W  #-1,(A5)+
  885.     MOVE.L  D5,D2
  886.     MOVE.L  A5,D3
  887.     SUB.L   D2,D3
  888.     TST.L   D1
  889.     BEQ.S   .LEAVE
  890.     BSR WRITEFILE
  891. .LEAVE: RTS
  892. ;*-*
  893. ;; Globals infos
  894. WRITEGLOBINFOS:
  895.     MOVEQ   #0,D1           ; D1=GLOB COUNT
  896.     MOVE.L  #ESTACKBUF,D5
  897.     MOVE.L  D5,A5           ; D5,A5=BUF
  898.     MOVE.W  #8,(A5)+
  899.     MOVE.W  #SKIPMARK,(A5)+
  900.     CLR.L   (A5)+
  901.     MOVE.L  ACODE,D3        ; D3=ACODE
  902.     MOVE.L  #IDENTHASH+4,D6
  903.     MOVE.L  #IDENTHASH+1028,D7  ; D6,D7=IDENTBUF,END
  904. .OLOOP: MOVE.L  D6,A4
  905.     ADDQ.L  #4,D6
  906.     CMP.L   D6,D7
  907.     BEQ .EX
  908. .LOOP:  MOVE.L  -(A4),A4
  909.     MOVE.L  A4,D4
  910.     BEQ.S   .OLOOP
  911.     CMP.B   #GLOBV,4(A4)
  912.     BNE.S   .LOOP
  913.     MOVE.L  6(A4),D0
  914.     BEQ.S   .LOOP
  915.     MOVE.L  A5,A1           ; A1=BACKUP A5
  916.     MOVE.L  D0,A0           ; A0=GLOBINFO
  917.     ADDQ.L  #1,D1
  918.     BTST    #2,5(A4)
  919.     BEQ.S   .NNAME
  920.     MOVE.L  (A0),A3         ; ASCIIPTR
  921.     MOVE.L  A5,A2
  922.     ADDQ.L  #2,A5
  923. .COPY:  MOVE.B  (A3)+,(A5)+     ; COPY IDENTIFIER
  924.     BNE.S   .COPY
  925.     MOVE.L  A5,D0
  926.     SUB.L   A2,D0
  927.     SUBQ.L  #2,D0
  928.     BTST    #0,D0
  929.     BEQ.S   .1
  930.     CLR.B   (A5)+
  931.     ADDQ.L  #1,D0
  932. .1: MOVE.W  D0,(A2)         ; set lenght
  933.     BRA.S   .2
  934. .NNAME: CLR.W   (A5)+
  935. .2: CHESTB  A5,D0,5,iERROR37
  936.     MOVE.L  4(A0),A0
  937.     MOVE.L  A0,D0
  938.     BEQ.S   .DEL
  939.     BRA.S   .GLT
  940. .GLL:   MOVE.L  4(A0),D0
  941.     SUB.L   D3,D0
  942.     MOVE.L  D0,(A5)+
  943.     MOVE.W  8(A0),(A5)+     ; ADD OPERSIZE (V10+ ONLY)
  944.     MOVE.L  (A0),A0
  945. .GLT:   MOVE.L  A0,D0
  946.     BNE.S   .GLL
  947.     CLR.L   (A5)+
  948.     BRA .LOOP
  949. .EX:    MOVE.W  #-1,(A5)+
  950.     TST.L   D1
  951.     BEQ.S   .LEAVE
  952.     MOVE.L  D5,D2
  953.     MOVE.L  A5,D3
  954.     SUB.L   D2,D3
  955.     MOVE.L  D5,A0
  956.     MOVE.L  D3,D0
  957.     SUBQ.L  #8,D0           ; CHUNKSIZE-HEAD(2)-SKIP(6)
  958.     MOVE.L  D0,4(A0)
  959.     BSR WRITEFILE
  960. .LEAVE: RTS
  961. .DEL:   SUBQ.L  #1,D1
  962.     MOVE.L  A1,A5
  963.     BRA.W   .LOOP
  964. ;*-*
  965. ;; Modules infos
  966. WRITEMODINFOS:
  967.     MOVEQ   #0,D1           ; D1=MOD COUNT
  968.     MOVE.L  #ESTACKBUF,D5
  969.     MOVE.L  D5,A5           ; D5,A5=BUF
  970.     MOVE.W  #9,(A5)+
  971.     CLR.L   (A5)+
  972.     MOVE.L  ACODE,D3        ; D3=ACODE
  973.     LEA MODINFOLIST,A0
  974. .XL:MOVE.L  (A0),D0
  975.     BEQ.W   .EX
  976.     MOVE.L  D0,A0           ; A0=MODINFO
  977.     MOVE.L  MI_LIST(A0),D0
  978.     BEQ.S   .XL
  979.     MOVE.L  D0,A1           ; A1=PROCCLASS
  980.  
  981.     MOVE.L  MI_NAMEPTR(A0),A3
  982.     MOVE.L  A5,A6           ; A6=BEGIN ONE MOD
  983.     ADDQ.L  #2,A5
  984. .COPY:  MOVE.B  (A3)+,(A5)+     ; COPY MODNAME
  985.     BNE.S   .COPY
  986.     MOVE.L  A5,D0
  987.     SUB.L   A6,D0
  988.     SUBQ.L  #2,D0
  989.     BTST    #0,D0
  990.     BEQ.S   .1
  991.     CLR.B   (A5)+
  992.     ADDQ.L  #1,D0
  993. .1: MOVE.W  D0,(A6)         ; set lenght
  994.     MOVEQ   #0,D4           ; D4=NUMPROCCLASS
  995.  
  996. .L2:    ;TST.L  PC_ACC(A1)
  997.     ;BEQ.S  .NEXT
  998.     MOVE.W  PC_TYPE(A1),D0
  999.     MOVE.L  PC_INFO(A1),A4      ; A4=ID OR CLASS
  1000.     CMP.W   #2,D0
  1001.     BNE.S   .3
  1002.     MOVE.L  (A4),A3         ; A3=ASC
  1003.     TST.L   PC_ACC(A1)      ; PROCC NOACC CHECK
  1004.     BEQ.W   .NEXT
  1005.     BRA.S   .4
  1006. .3: MOVE.L  OASCII(A4),A3
  1007.     TST.L   OACC(A4)        ; CLASS NOACC CHECK
  1008.     BEQ.W   .NEXT
  1009. .4:
  1010.     MOVE.W  D0,(A5)+
  1011.     ADDQ.L  #1,D4
  1012.     ADDQ.L  #1,D1
  1013.  
  1014.     MOVE.L  A5,A2
  1015.     ADDQ.L  #2,A5
  1016. .COPY2: MOVE.B  (A3)+,(A5)+     ; COPY PROCNAME
  1017.     BNE.S   .COPY2
  1018.     MOVE.L  A5,D0
  1019.     SUB.L   A2,D0
  1020.     SUBQ.L  #2,D0
  1021.     BTST    #0,D0
  1022.     BEQ.S   .2
  1023.     CLR.B   (A5)+
  1024.     ADDQ.L  #1,D0
  1025. .2: MOVE.W  D0,(A2)         ; set lenght
  1026.  
  1027.     CMP.W   #2,PC_TYPE(A1)
  1028.     BNE.S   .5
  1029.     MOVE.L  6(A4),D0
  1030.     BEQ.S   .7
  1031.     MOVE.L  D0,A3
  1032.     MOVE.W  (A3),(A5)+
  1033.     BRA.S   .8
  1034. .7: MOVE.W  #-1,(A5)+
  1035. .8: MOVE.L  PC_ACC(A1),A3
  1036.     ADDQ.L  #2,A5
  1037.     MOVE.L  A5,A4
  1038. .L3:    MOVE.L  4(A3),D2
  1039.     SUB.L   D3,D2
  1040.     MOVE.L  D2,(A5)+
  1041.     MOVE.L  (A3),D0
  1042.     MOVE.L  D0,A3
  1043.     TST.L   D0
  1044.     BNE.S   .L3
  1045.     MOVE.L  A5,D0
  1046.     SUB.L   A4,D0
  1047.     LSR.L   #2,D0
  1048.     MOVE.W  D0,-2(A4)
  1049.     BRA.W   .6
  1050.  
  1051. .5: MOVE.L  PC_INFO(A1),A3      ; WE GET HERE FOR CLASS
  1052.     MOVE.L  A5,A4
  1053.     ADDQ.L  #2,A5
  1054.     LEA OACC(A3),A3
  1055.     MOVE.L  ACODE(PC),D2
  1056. .CLL:   MOVE.L  (A3),D0
  1057.     BEQ.S   .CLE
  1058.     MOVE.L  D0,A3
  1059.     MOVE.L  4(A3),D0
  1060.     SUB.L   D2,D0
  1061.     MOVE.L  D0,(A5)+
  1062.     MOVE.W  8(A3),(A5)+
  1063.     BRA.S   .CLL
  1064. .CLE:   MOVE.L  A5,D0
  1065.     SUB.L   A4,D0
  1066.     DIVU    #6,D0
  1067.     MOVE.W  D0,(A4)
  1068.  
  1069. .6:
  1070. .NEXT:  MOVE.L  (A1),D0
  1071.     MOVE.L  D0,A1
  1072.     CHESTB  A5,D2,3,iERROR37
  1073.     TST.L   D0
  1074.     BNE.W   .L2
  1075.     TST.L   D4
  1076.     BNE.S   .10
  1077.     MOVE.L  A6,A5
  1078.     BRA.S   .11
  1079. .10:    CLR.W   (A5)+
  1080. .11:    BRA.W   .XL
  1081.  
  1082. .EX:    CLR.W   (A5)+
  1083.     TST.L   D1
  1084.     BEQ.S   .LEAVE
  1085.     MOVE.L  D5,D2
  1086.     MOVE.L  A5,D3
  1087.     SUB.L   D2,D3
  1088.     MOVE.L  D5,A0
  1089.     MOVE.L  D3,D0
  1090.     SUBQ.L  #6,D0           ; CHUNKSIZE-HEAD(2)-SKIP(4)
  1091.     MOVE.L  D0,2(A0)
  1092.     BSR WRITEFILE
  1093. .LEAVE: RTS
  1094. ;*-*
  1095. ;*-*
  1096. ;*-*
  1097.  
  1098.